Keyword: KMM in exist project
KMM這麼好,但是我們專案已經開發了五年了,整個Code Base十分龐大,裡面還都是我多年的心血,現在轉換成KMM還來得及嘛?
答案是:當然可以
再次請出第一天這張圖
根據KMM的架構圖,只要把共用的商業邏輯抽出來到shared module內就可以,而雙平台原本的畫面呈現仍然可以保留,對於Android開發者來說,更是只要把商業邏輯以下的部分修改依賴即可.當然,如果你在裡面用了像是LiveData,Room這些只有Android才有的組件的話,由於iOS不能理解這些,所以可能要重寫或是修改.
這時候就只能祈禱大家平常有遵守架構與clean architecture來寫了
為了讓雙方能夠共用,我們要先建立一個shared Module.首先,先用AndroidStudio打開已經先寫好的Android專案,根據File ⇒New ⇒ Module來建立一個Module
然後拉到最下面,可以找到KMM Shared Module(如果有安裝KMM Plugin的話),可以把Module 的名稱改成熟悉的shared
按下Finish就可以看到熟悉的shared結構出現了
有了Module後,必須要在Gradle設定,讓Android的部分可以享受到shared內的程式碼.
在gradle(Android)的dependencies內 加上這行
implementation project(':shared')
然後同步Gradle.
接下來可以在專案的任意地方,嘗試使用shared的內容,在shared中,有一些KMM幫我們預先建好的物件可以用來測試有沒有成功.
比如說我在某個Fragment加上
Log.e("KMMExample", "Hello from shared module: " + (Greeting().greeting()))
執行出來有結果就是成功了
然後可以把商業邏輯一步一步的搬進shared中,記得不同平台的實作要使用Expect/Actual分開.
(下面的圖都是偷官網的)
接下來建立一個iOS專案,打開Xcode,選擇File ⇒New ⇒ Project.跳出專案精靈.
然後切換到iOS頁籤,選擇建立一個App
然後打上專案名稱
然後會需要選擇專案的位置 ,這邊請指向你的Android專案的Root .
然後你在Android Studio內應該就能看到剛剛建立的iOS專案了
你可以把他改名成我們熟悉的iosApp
然後我們要追加一些設定,讓iOS在編譯的時期也能夠執行KMM的Script產生必要檔案.
首先,在Xcode左邊點兩下專案名稱,來打開專案設定
在Build Phases的頁籤左上的地方,點加號 ,然後選擇New Run Script Phase.來建立一個新的Script
在script內加上這段
cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode
然後把新增加的這段Run Script往上提到 Compile Sources之上 Dependencies之下
接下來 切換上面的頁籤到Build Settings 找到Search Paths下面的Framework Search Path
(有點難找,可以直接搜尋)
裡面加上這段
$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)
再找到 Linking 下面的Other Linker flags
同樣加上
$(inherited) -framework shared
然後執行專案,如果正常設定應該會成功編譯並且出現畫面
在Xcode中修改ContentView的內容
//這是swift
import SwiftUI
import shared //加入這行來使用shared
struct ContentView: View {
var body: some View {
Text(Greeting().greeting())
.padding()//這行使用了shared裡面的Greeting物件
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如果正常編譯通過,應該會出現以下畫面
大功告成!接下來就跟一般的KMM專案相同的流程開發了!